/**
 * @Description: 该文件用于对taskStore进行操作,该类相当于java项目中的service层
 * @author Fengli
 * @date 4/29/19
*/
import {taskDb} from '@/util/dao/ConfigDB'
import {getUUID} from '@/util/ApplicationUtil'
import GLOBAL from '@/util/const/global'// 引用全局变量，整个应用都有效
/*
import {Result} from '@/util/Result'
import {CodeEnum} from '@/util/enum/CodeEnum'
*/

/**
 *用于保存任务(async将返回一个Promise)
 * @param task
 */
export function saveTask (task) {
  // 判断是更新任务还是添加任务
  if (task.id === null || task.id === undefined) {
    return addTask(task)
  } else {
    return updateTask(task)
  }
}

/**
 * 用于添加任务
 * @param task
 * @returns {*}
 */
export function addTask (task) {
  /* 设置其他参数 */
  task.id = getUUID()
  task.createTime = new Date().format(GLOBAL.formatDate1)
  task.del = false
  task.isDone = false
  return taskDb.taskStore.add(task)/* .then((response) => {
    return new Result('添加任务成功', CodeEnum.SUCCESS, true)
  }).catch((error) => {
    return new Result(error.message, CodeEnum.FAIL, false)
  }) */
}

/**
 * 批量添加任务
 * @param tasks 需要被批量添加的任务
 * @returns {Dexie.Promise<Key>}
 */
export function bulkAddTasks (tasks) {
  // 遍历tasks修改createTime
  tasks.forEach(function (element, index, array) {
    let now = new Date()
    element.createTime = now.format(GLOBAL.formatDate1)
    element.startTime = element.startTime.format(GLOBAL.formatDate1)
    element.endTime = element.endTime.format(GLOBAL.formatDate1)
    element.id = getUUID()
    element.del = false
    element.isDone = false
  })
  return taskDb.taskStore.bulkAdd(tasks)
}

/**
 * 从后台获得的任务数据，可以通过该方法批量添加到indexedDB中去
 * @param tasks
 * @returns {*}
 */
export function bulkAddTasksFromBackEnd (tasks) {
  return taskDb.taskStore.bulkAdd(tasks)
}

/**
 * 删除指定id的task,是真删除
 * @param id
 * @param how 若how为true,表示是真删除，否则表示为设置del为true
 * @returns {Promise<void>}
 */
export function deleteTask (id, how) {
  if (how === true) {
    return taskDb.taskStore.delete(id)
  } else {
    return taskDb.taskStore.update(id, {del: true})
  }
}

/* 改 */
/**
 * 用于更新任务
 * @param task
 * @returns {*}
 */
export function updateTask (task) {
  return taskDb.taskStore.update(task.id, {content: task.content, startTime: task.startTime, endTime: task.endTime, date: task.date, importanceValue: task.importanceValue})
}

export function doneTask (id) {
  // 获取任务完成时间
  let d = new Date().format(GLOBAL.formatDate1)
  // 更新
  return taskDb.taskStore.update(id, {realEndTime: d, isDone: true})
}

/* 查 */

/**
 * 查询所有的任务（注意这里不能用索引方式，因为索引不支持boolean） todo 其实这里可以添加查询条件
 * @returns {*|Dexie.Promise<Array<T>>|Dexie.Promise<any>|Dexie.Promise<Array<T>>|T[]}
 */
export function queryAllTasks () {
  // return taskDb.taskStore.where('del').equals(false).toArray()
  return taskDb.taskStore.filter((item) => {
    return !item.del && !item.isDone
  }).toArray()
}

/**
 * 根据任务id查询任务
 * @param id
 * @returns {Dexie.Promise<T | undefined>}
 */
export function queryTaskById (id) {
  return taskDb.taskStore.where('id').equals(id).first()
}

/**
 * 根据条件查询tasks
 * @param condition
 */
export function queryTasksByCondition (condition) {
  let p
  let day = condition.day.format(GLOBAL.formatDate2)
  switch (condition.order) {
    case 'u':
      p = taskDb.taskStore.where({ 'date': day }).filter((item) => {
        return !(item.del || item.isDone)
      }).sortBy('startTime')
      break
    case 'i':
      p = taskDb.taskStore.where({ 'date': day }).filter((item) => {
        return !(item.del || item.isDone)
      }).reverse().sortBy('importanceValue')
      break
    case 'iu':
      // todo 需要计算权重
      break
    case 'all':
      p = queryAllTasks()
      break
  }
  return p
}

/* todo 与远程同步 */
